﻿/*
输入：
4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1
输出：
3
*/

// N行，M列
string[] NMStrArr = Console.ReadLine().Split(" ");
int N = int.Parse(NMStrArr[0]);
int M = int.Parse(NMStrArr[1]);

// 地图
int[,] map = new int[N,M];
for (int i = 0; i < N; i++)
{
    string[] lines = Console.ReadLine().Split(" ");
    for (int j = 0; j < lines.Length; j++)
    {
        map[i, j] = int.Parse(lines[j]);
    }
}

// 深度优先搜索
void dfs(int[,] map, int i, int j)
{
    map[i, j] = 0;
    // 右侧为陆地
    if (j < map.GetLength(1) - 1 && map[i, j+1] == 1)
    {
        dfs(map, i, j + 1);
    }
    // 下侧为陆地
    if (i < map.GetLength(0) - 1 && map[i+1, j] == 1)
    {
        dfs(map, i + 1, j);
    }
    // 左侧为陆地
    if (j > 0 && map[i, j-1] == 1)
    {
        dfs(map, i, j-1);
    }
    // 上侧为陆地
    if (i > 0 && map[i-1, j] == 1)
    {
        dfs(map, i-1, j);
    }
}

// 结果
int res = 0;
for (int i = 0; i < N; i++)
{
    for (int j = 0; j < M; j++)
    {
        if (map[i, j] == 0) continue;
        res++;
        // 启动深搜
        dfs(map, i, j);
    }
}
Console.WriteLine(res);